home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / Pager / Sliding.php < prev   
PHP Script  |  2004-10-01  |  12KB  |  315 lines

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PEAR :: Pager_Sliding                                                |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997-2003 The PHP Group                                |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 2.0 of the PHP license,       |
  8. // | that is bundled with this package in the file LICENSE, and is        |
  9. // | available at through the world-wide-web at                           |
  10. // | http://www.php.net/license/2_02.txt.                                 |
  11. // | If you did not receive a copy of the PHP license and are unable to   |
  12. // | obtain it through the world-wide-web, please send a note to          |
  13. // | license@php.net so we can mail you a copy immediately.               |
  14. // +----------------------------------------------------------------------+
  15. // | Author: Lorenzo Alberton <l.alberton at quipo.it>                    |
  16. // +----------------------------------------------------------------------+
  17. //
  18. // $Id: Sliding.php,v 1.5 2004/01/16 10:29:57 quipo Exp $
  19.  
  20. require_once 'Pager/Common.php';
  21.  
  22. /**
  23.  * File Sliding.php
  24.  *
  25.  * @package Pager
  26.  */
  27. /**
  28.  * Pager_Sliding - Generic data paging class  ("sliding window" style)
  29.  *
  30.  * Usage examples can be found in the doc provided
  31.  *
  32.  * @author  Lorenzo Alberton <l.alberton at quipo.it>
  33.  * @version $Id: Sliding.php,v 1.5 2004/01/16 10:29:57 quipo Exp $
  34.  * @package Pager
  35.  */
  36. class Pager_Sliding extends Pager_Common
  37. {
  38.     // {{{ Pager_Sliding()
  39.  
  40.     /**
  41.      * Constructor
  42.      *
  43.      * @param mixed $options    An associative array of option names
  44.      *                          and their values
  45.      * @access public
  46.      */
  47.     function Pager_Sliding($options = array())
  48.     {
  49.         //set default Pager_Sliding options
  50.         $this->_delta                 = 2;
  51.         $this->_prevImg               = '«';
  52.         $this->_nextImg               = '»';
  53.         $this->_separator             = '|';
  54.         $this->_spacesBeforeSeparator = 3;
  55.         $this->_spacesAfterSeparator  = 3;
  56.         $this->_curPageSpanPre        = '<b><u>';
  57.         $this->_curPageSpanPost       = '</u></b>';
  58.  
  59.         //set custom options
  60.         $err = $this->_setOptions($options);
  61.         if ($err !== PAGER_OK) {
  62.             return $this->raiseError($this->errorMessage($err), $err);
  63.         }
  64.         $this->_generatePageData();
  65.         $this->_setFirstLastText();
  66.  
  67.         if ($this->_totalPages > (2 * $this->_delta + 1)) {
  68.             $this->links .= $this->_printFirstPage();
  69.         }
  70.  
  71.         $this->links .= $this->_getBackLink();
  72.         $this->links .= $this->_getPageLinks();
  73.         $this->links .= $this->_getNextLink();
  74.  
  75.         $this->linkTags .= $this->_getFirstLinkTag();
  76.         $this->linkTags .= $this->_getPrevLinkTag();
  77.         $this->linkTags .= $this->_getNextLinkTag();
  78.         $this->linkTags .= $this->_getLastLinkTag();
  79.  
  80.         if ($this->_totalPages > (2 * $this->_delta + 1)) {
  81.             $this->links .= $this->_printLastPage();
  82.         }
  83.     }
  84.  
  85.     // }}}
  86.     // {{{ getPageIdByOffset()
  87.  
  88.     /**
  89.      * "Overload" PEAR::Pager method. VOID. Not needed here...
  90.      * @param integer $index Offset to get pageID for
  91.      * @deprecated
  92.      * @access public
  93.      */
  94.     function getPageIdByOffset($index=null) { }
  95.  
  96.    // }}}
  97.     // {{{ getPageRangeByPageId()
  98.  
  99.     /**
  100.      * Given a PageId, it returns the limits of the range of pages displayed.
  101.      * While getOffsetByPageId() returns the offset of the data within the
  102.      * current page, this method returns the offsets of the page numbers interval.
  103.      * E.g., if you have pageId=5 and delta=2, it will return (3, 7).
  104.      * PageID of 9 would give you (4, 8).
  105.      * If the method is called without parameter, pageID is set to currentPage#.
  106.      *
  107.      * @param integer PageID to get offsets for
  108.      * @return array  First and last offsets
  109.      * @access public
  110.      */
  111.     function getPageRangeByPageId($pageid = null)
  112.     {
  113.         $pageid = isset($pageid) ? (int)$pageid : $this->_currentPage;
  114.         if (!isset($this->_pageData)) {
  115.             $this->_generatePageData();
  116.         }
  117.         if (isset($this->_pageData[$pageid]) || is_null($this->_itemData)) {
  118.             if ($this->_expanded) {
  119.                 $min_surplus = ($pageid <= $this->_delta) ? ($this->_delta - $pageid + 1) : 0;
  120.                 $max_surplus = ($pageid >= ($this->_totalPages - $this->_delta)) ?
  121.                                 ($pageid - ($this->_totalPages - $this->_delta)) : 0;
  122.             } else {
  123.                 $min_surplus = 0;
  124.                 $max_surplus = 0;
  125.             }
  126.             return array(   max($pageid - $this->_delta - $max_surplus, 1),
  127.                             min($pageid + $this->_delta + $min_surplus, $this->_totalPages));
  128.         } else {
  129.             return array(0, 0);
  130.         }
  131.     }
  132.  
  133.     // }}}
  134.     // {{{ getLinks()
  135.  
  136.     /**
  137.      * Returns back/next/first/last and page links,
  138.      * both as ordered and associative array.
  139.      *
  140.      * @param integer $pageID Optional pageID. If specified, links
  141.      *                for that page are provided instead of current one.
  142.      * @return array back/pages/next/first/last/all links
  143.      * @access public
  144.      */
  145.     function getLinks($pageID = null)
  146.     {
  147.         if ($pageID != null) {
  148.             $_sav = $this->_currentPage;
  149.             $this->_currentPage = $pageID;
  150.  
  151.             $this->links = '';
  152.             if ($this->_totalPages > (2 * $this->_delta + 1)) {
  153.                 $this->links .= $this->_printFirstPage();
  154.             }
  155.             $this->links .= $this->_getBackLink();
  156.             $this->links .= $this->_getPageLinks();
  157.             $this->links .= $this->_getNextLink();
  158.             if ($this->_totalPages > (2 * $this->_delta + 1)) {
  159.                 $this->links .= $this->_printLastPage();
  160.             }
  161.         }
  162.  
  163.         $back  = str_replace(' ', '', $this->_getBackLink());
  164.         $next  = str_replace(' ', '', $this->_getNextLink());
  165.         $pages = $this->_getPageLinks();
  166.         $first = $this->_printFirstPage();
  167.         $last  = $this->_printLastPage();
  168.         $all   = $this->links;
  169.         $linkTags = $this->linkTags;
  170.  
  171.         if ($pageID != null) {
  172.             $this->_currentPage = $_sav;
  173.         }
  174.  
  175.         return array(
  176.                     $back,
  177.                     $pages,
  178.                     trim($next),
  179.                     $first,
  180.                     $last,
  181.                     $all,
  182.                     $linkTags,
  183.                     'back'  => $back,
  184.                     'pages' => $pages,
  185.                     'next'  => $next,
  186.                     'first' => $first,
  187.                     'last'  => $last,
  188.                     'all'   => $all,
  189.                     'linktags' => $linkTags
  190.                 );
  191.     }
  192.  
  193.     // }}}
  194.     // {{{ _getPageLinks()
  195.  
  196.     /**
  197.      * Returns pages link
  198.      *
  199.      * @return string Links
  200.      * @access private
  201.      */
  202.     function _getPageLinks()
  203.     {
  204.         //legacy setting... the preferred way to set an option now
  205.         //is adding it to the constuctor
  206.         if (!empty($url)) {
  207.             $this->_path = $url;
  208.         }
  209.         $links = '';
  210.         if ($this->_totalPages > (2 * $this->_delta + 1)) {
  211.             if ($this->_expanded) {
  212.                 if (($this->_totalPages - $this->_delta) <= $this->_currentPage) {
  213.                     $_expansion_before = $this->_currentPage - ($this->_totalPages - $this->_delta);
  214.                 } else {
  215.                     $_expansion_before = 0;
  216.                 }
  217.                 for ($i = $this->_currentPage - $this->_delta - $_expansion_before; $_expansion_before; $_expansion_before--, $i++) {
  218.                     if (($i != $this->_currentPage + $this->_delta)){ // && ($i != $this->_totalPages - 1)) {
  219.                         $_print_separator_flag = true;
  220.                     } else {
  221.                         $_print_separator_flag = false;
  222.                     }
  223.  
  224.                     $this->range[$i] = false;
  225.                     $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
  226.                                         ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
  227.                                         $this->_classString,
  228.                                         $this->_altPage.' '.$i,
  229.                                         $i)
  230.                            . $this->_spacesBefore
  231.                            . ($_print_separator_flag ? $this->_separator.$this->_spacesAfter : '');
  232.                 }
  233.             }
  234.  
  235.             $_expansion_after = 0;
  236.             for ($i = $this->_currentPage - $this->_delta; ($i <= $this->_currentPage + $this->_delta) && ($i <= $this->_totalPages); $i++) {
  237.                 if ($i<1) {
  238.                     $_expansion_after++;
  239.                     continue;
  240.                 }
  241.  
  242.                 // check when to print separator
  243.                 if (($i != $this->_currentPage + $this->_delta) && ($i != $this->_totalPages )) {
  244.                     $_print_separator_flag = true;
  245.                 } else {
  246.                     $_print_separator_flag = false;
  247.                 }
  248.  
  249.                 if ($i == $this->_currentPage) {
  250.                     $this->range[$i] = true;
  251.                     $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost
  252.                                  . $this->_spacesBefore
  253.                                  . ($_print_separator_flag ? $this->_separator.$this->_spacesAfter : '');
  254.                 } else {
  255.                     $this->range[$i] = false;
  256.                     $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
  257.                                         ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
  258.                                         $this->_classString,
  259.                                         $this->_altPage.' '.$i,
  260.                                         $i)
  261.                                  . $this->_spacesBefore
  262.                                  . ($_print_separator_flag ? $this->_separator.$this->_spacesAfter : '');
  263.                 }
  264.             }
  265.  
  266.             if ($this->_expanded && $_expansion_after) {
  267.                 $links .= $this->_separator . $this->_spacesAfter;
  268.                 for ($i = $this->_currentPage + $this->_delta +1; $_expansion_after; $_expansion_after--, $i++) {
  269.                     if (($_expansion_after != 1)) {
  270.                        $_print_separator_flag = true;
  271.                     } else {
  272.                         $_print_separator_flag = false;
  273.                     }
  274.  
  275.                     $this->range[$i] = false;
  276.                     $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
  277.                                         ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
  278.                                         $this->_classString,
  279.                                         $this->_altPage.' '.$i,
  280.                                         $i)
  281.                            . $this->_spacesBefore
  282.                            . ($_print_separator_flag ? $this->_separator.$this->_spacesAfter : '');
  283.                 }
  284.             }
  285.  
  286.         } else {
  287.             //if $this->_totalPages <= (2*Delta+1) show them all
  288.             for ($i=1; $i<=$this->_totalPages; $i++) {
  289.                 if ($i != $this->_currentPage) {
  290.                     $this->range[$i] = false;
  291.                     $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
  292.                                     ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
  293.                                     $this->_classString,
  294.                                     $this->_altPage.' '.$i,
  295.                                     $i);
  296.                 } else {
  297.                     $this->range[$i] = true;
  298.                     $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost;
  299.                 }
  300.                 $links .= $this->_spacesBefore
  301.                        . (($i != $this->_totalPages) ? $this->_separator.$this->_spacesAfter : '');
  302.             }
  303.         }
  304.  
  305.         if ($this->_clearIfVoid) {
  306.             //If there's only one page, don't display links
  307.             if ($this->_totalPages < 2) $links = '';
  308.         }
  309.  
  310.         return $links;
  311.     }
  312.  
  313.     // }}}
  314. }
  315. ?>